package main

import "fmt"

type Tag int

const (
	Identifier Tag = iota
	Number
	Operator
	// ... 其他可能的Tag
)

type Token struct {
	Kind Tag
	Val  int
	Loc  int
	Len  int
	Next *Token
}

func main() {
	// 假设我们要创建一些Token并将它们链接起来
	var head *Token // 链表头指针
	var tail *Token // 链表尾指针，用于快速添加新元素

	// 创建一个Token并设置为头节点
	head = &Token{Kind: Identifier, Val: 1, Loc: 0, Len: 5, Next: nil}
	tail = head

	// 假设我们要继续添加几个Token
	tokensToAdd := []struct {
		kind Tag
		val  int
		loc  int
		len  int
	}{
		{Number, 123, 6, 3},
		{Operator, 0, 9, 1}, // 假设'+'的标识符是0
		// ... 可以继续添加
	}

	for _, tokenInfo := range tokensToAdd {
		newToken := &Token{
			Kind: tokenInfo.kind,
			Val:  tokenInfo.val,
			Loc:  tokenInfo.loc,
			Len:  tokenInfo.len,
			Next: nil, // 初始时没有下一个Token
		}

		// 将新Token链接到链表的末尾
		tail.Next = newToken
		tail = newToken // 更新尾指针
	}

	// 打印链表中的Token（仅作为示例，实际中可能需要更复杂的逻辑来遍历链表）
	current := head
	for current != nil {
		fmt.Printf("Kind: %v, Val: %d, Loc: %d, Len: %d\n", current.Kind, current.Val, current.Loc, current.Len)
		current = current.Next
	}
}
